import axios from 'axios'

import {
	MessageBox
} from "element-ui";

// 创建一个axios实例
const instance = axios.create({
  timeout: 300000,
  headers: {
    'Content-Type': 'application/json'
  }
})

// 从localStorage中获取token，token存的是object信息，有tokenExpireTime和token两个字段
function getToken() {
	let tokenObj = {}
	try {
		tokenObj = storage.get('token')
		tokenObj = tokenObj ? JSON.parse(tokenObj) : {}
	} catch {
		console.error('get token from localStorage error')
	}
	return "Bearer" + tokenObj.token
}

function refreshToken() {
	// instance是当前request.js中已创建的axios实例
	return instance.post('/refreshtoken').then(res => res.data)
}

// 给实例添加一个setToken方法，用于登录后方便将最新token动态添加到header，同时将token保存在localStorage中
instance.setToken = (obj) => {
	instance.defaults.headers['Authorization'] = "Bearer " + obj.token
	window.localStorage.setItem('token', JSON.stringify(obj)) // 注意这里需要变成字符串后才能放到localStorage中
}

// 是否正在刷新的标记
let isRefreshing = false
// 重试队列，每一项将是一个待执行的函数形式
let requests = []
instance.interceptors.request.use((config) => {
	// console.log("config", config)
	if (config.url.indexOf('/login') >= 0 ||
		config.url.indexOf('/auth') >= 0 ||
		config.url.indexOf('/ich') >= 0) {
		return config
	}
	const tokenObj = getToken()
	// 添加请求头
	config.headers['Authorization'] = "Bearer " + tokenObj.token
	// 登录接口和刷新token接口绕过
	if (tokenObj.token && tokenObj.tokenExpireTime) {
		const now = Date.now()
		if (now > tokenObj.tokenExpireTime) {
			// 当前时间大于过期时间，立即刷新token
			if (!isRefreshing) {
				console.log('刷新token ing')
				// true表示正在刷新，防止队列重复刷新
				isRefreshing = true
				refreshToken().then(res => {
					const {
						token,
						refreshToken,
						tokenExprieTime
					} = res.data
					// const tokenExpireTime = now + tokenExprieIn * 1000
					instance.setToken({
						token,
						refreshToken,
						tokenExpireTime
					})
					isRefreshing = false
					return token
				}).then((token) => {
					console.log('刷新token成功，执行队列')
					requests.forEach(cb => cb(token))
					// 执行完成后，清空队列
					requests = []
				}).catch(res => {
					console.error('refresh token error: ', res)
				})
			}
			const retryOriginalRequest = new Promise((resolve) => {
				requests.push((token) => {
					// 因为config中的token是旧的，所以刷新token后要将新token传进来
					config.headers['Authorization'] = "Bearer " + token
					resolve(config)
				})
			})
			return retryOriginalRequest
		}
	}
	return config
}, (error) => {
	// Do something with request error
	return Promise.reject(error)
})

// 请求返回后拦截
instance.interceptors.response.use(
	(response) => {
		return response;
	},
	(error) => {
		if (error.response) {
			if (error.response.status === 401) {
				MessageBox.alert(
					"抱歉！您的身份认证信息已过期！请重新登录！",
					"身份认证过期", {
						type: "error"
					}
				);
				window.setTimeout("window.location.href='/'", 1500);
			}
			// else if (error.response.status === 400) {
			// 	MessageBox.alert("出错啦！请联系管理员", "错误！", {
			// 		type: "error"
			// 	});
			// }
		}
		return Promise.reject(error.response.data);
	}
);

export default instance
